function debounce(fn, delay, immediate = false) {
  // 记录定时器
  let timer = null;
  // 记录当前执行状态
  let isInvoke = false;

  const _debounce = function (...args) {
    // 清除上一次定时器
    if (timer) clearTimeout(timer);

    if (!isInvoke && immediate) {
      // 开始立即执行
      fn.apply(this, args);
      isInvoke = true;
    } else {
      // 延迟执行
      timer = setTimeout(() => {
        fn.apply(this, args);
        isInvoke = false;
        timer = null;
      }, delay);
    }
  };

  // 取消抖动功能
  _debounce.cancel = function () {
    if (timer) clearTimeout(timer);
    isInvoke = false;
    timer = null;
  };

  return _debounce;
}

function throttle(fn, interval) {
  let isInvoke = false;

  function _throttle(...agrs) {
    if (!isInvoke) {
      isInvoke = true;
      fn.apply(this, agrs);
      setTimeout(() => {
        isInvoke = false;
      }, interval);
    }
  }

  return _throttle;
}
